//
//  RCHomeController.swift
//  RC-微博0305
//
//  Created by 任淳 on 16/3/5.
//  Copyright © 2016年 ReverChun. All rights reserved.
//

import UIKit
import SVProgressHUD


let cellidentifier = "cellIdentifier"

class RCHomeController: RCBaseViewController {
    
    
    lazy var modelArr = [RCUserStatus]()
    
    let myRefresh = RCRefreshView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //没登录就显示访客视图
        if !RCUserModel.sharedUserModel.isLobin {
            
            visitorView.setCircleImageAndLab(imageName: nil, labText: "")
            return
            
        }
        
        //注册cell
        regisiterCell()
        
        //调用方法 加载数据 拿到数据
        loadData()
        
    }

    
    func regisiterCell() {
        
        tableView.registerClass(RCHomeCell.self , forCellReuseIdentifier: cellidentifier)
        
//        tableView.rowHeight = 250
        
        //tableView自动计算行高需要设置两个属性
        //设置预估行高 尽量接近真实行高   contentSize = estimatedRowHeight * count
        tableView.estimatedRowHeight = 300
        //tableView 固定行高 就应该设置 自动计算
        //注意: 必须对contentView底部添加约束
        tableView.rowHeight = UITableViewAutomaticDimension
        //取消cell的分割线
        tableView.separatorStyle = .None
        
//        //开启系统默认的下拉刷新
//        refreshControl = UIRefreshControl()
//        //刷新时执行的方法 添加时间 值改变时执行
//        refreshControl?.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)

        //不用系统默认的刷新控件 不好用 用自定义的
//        let myRefresh = RCRefreshView()
        view.addSubview(myRefresh)
        //添加刷新视图的方法 舒心视图要继承自UIControl才能交互添加点击方法
        myRefresh.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)
        
        //设置上拉刷新的菊花tableView的tablefooterView
        tableView.tableFooterView = indicatorView
        
        //当界面中有多个scrollView时 要想点击回到顶部 必须关闭其他scrollView的scrollsToTop 默认是开着的
        tableView.scrollsToTop = true
        
        //添加刷新微博条数显示
        navigationController?.navigationBar.addSubview(refreshLab)
        //refreshLab应该添加到navigationBar最底下 不下拉不能看到
        navigationController?.navigationBar.insertSubview(refreshLab, atIndex: 0)
        
    }
    
    //显示刷新数据条数的label
    lazy var refreshLab:UILabel = {
       let lab = UIFactory.labelWith("", textColor: UIColor.whiteColor(), fontSize: 16)
        lab.backgroundColor = UIColor.purpleColor()
        lab.frame = CGRect(x: 0, y: -64, width: screenWidth, height: 44)
        return lab
        
    }()
    
    //下拉刷新的时候让lab下来显示新微薄的条数
    func makeRefreshLabAnimate(newStatusCount:Int) {
        //记录原始的frame
        let rect = refreshLab.frame
        //设置有多少条新微博
        refreshLab.text = newStatusCount == 0 ? "没有新微薄" : "有\(newStatusCount)条新微薄"
        
        UIView.animateWithDuration(0.5, animations: { () -> Void in
            self.refreshLab.frame = CGRect(x: 0, y: 44, width: screenWidth, height: 44)
            
            }) { (_) -> Void in
                //回复原始frame
                UIView.animateWithDuration(0.3, delay: 1, options: [], animations: { () -> Void in
                    self.refreshLab.frame = rect
                    
                    }, completion: { (_) -> Void in
                        
            })
                
        }
        
    }
    
    
    func loadData() {
        
        //since_id 和 max_id同时指定值 会导致下拉刷新和上拉加载更多数据 获取不到新数据
        //since_id 和 max_id 不能够同时有值 因为服务器无法判断要获取什么数据  这两个参数 是 '互斥' 参数
        
        //怎样让max_id跟底部小菊花对应上 用底部小菊花是否转动来判断 转动就加载max_id 不转就是下拉刷新 加载since_id
        
        var max_id:Int64 = 0
        var since_id:Int64 = 0
        
        if indicatorView.isAnimating() {
           
            //上拉刷新
            //若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
            max_id = modelArr.last?.id ?? 0
        }else{
           
            //刷新since_id之后发布的微博
            //若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
            since_id = modelArr.first?.id ?? 0
        }
        
        RCUserStatus.loadUserStatus(since_id,max_id: max_id) { (array) -> () in
            //一加载完数据就让小菊花停止转动
//            self.refreshControl?.endRefreshing()
            
            //将刷新状态恢复为默认状态
            self.myRefresh.endRefreshing()
            
            guard let newArr = array else {
                //界面层 就应该和用户交互
                SVProgressHUD.showErrorWithStatus("数据错误")
                return
            }
            if since_id > 0 {
                //有新数据 就把新数据添加在旧数据上面 下拉刷新
                self.modelArr = newArr + self.modelArr
                //一下了就显示新微薄条数的lab
                self.makeRefreshLabAnimate(newArr.count)
                
            }else {
                //加载完数据  就停止底部小菊花的转动 有开就得有关 再显示新的数据 上拉加载更多
                self.indicatorView.stopAnimating()
                //没有就不加载新的 只显示就数据
                self.modelArr = self.modelArr + newArr
            }
            
            //拿到数据后要刷新一下 不然不显示
            self.tableView.reloadData()
        }
        
    }
    
    //懒加载创建底部上拉刷新的小菊花 把小菊花设置成tableView的footerView
    lazy var indicatorView:UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
    
    
    //数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return modelArr.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        //纯手写要注册cell
        let cell = tableView.dequeueReusableCellWithIdentifier(cellidentifier, forIndexPath: indexPath) as! RCHomeCell
        
        cell.userStatus = modelArr[indexPath.row]
        //print(modelArr[indexPath.row].imageUrl!.count)
        
        //当浏览到最后一个cell的时候 自动的就去加载更多的数据 静默加载
        //底部小菊花没转的时候再去加载 转着呢就是正在加载着 就不要再去重复加载了
        if indexPath.row == modelArr.count - 1 && !indicatorView.isAnimating() {
            //一到最后一行 就让上拉刷新（底部）的小菊花开始转动
            indicatorView.startAnimating()
            
            loadData()
        }
        
        return cell
        
    }

}
